package com.cctc.framework.dao;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class BaseDao<T extends Object>
{
    @Autowired
    private HibernateTemplate hibernateTemplate;
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    /**
     * 根据SQl查询对象
     * 
     * @param sql
     * @return
     */
    protected Object selectSQLQuery(final StringBuffer sql)
    {
        return hibenateTemplateExecute(sql.toString(), false);
    }
    
    /**
     * 更新对象
     * 
     * @param sql
     * @return
     */
    protected Object notSelectSQlQuery(final String sql)
    {
        return hibenateTemplateExecute(sql, true);
    }
    
    @SuppressWarnings("unchecked")
    public  String getObjId()
    {
        return ((List<String>) selectSQLQuery("SELECT UUID()",false)).get(0);
    }
    
    private Object selectSQLQuery(String string, boolean b)
    {
        return hibenateTemplateExecute(string, false);
    }

    private Object hibenateTemplateExecute(final String sql, final boolean isUpdate)
    {
        return getHibernateTemplate().execute(new HibernateCallback<Object>()
        {
            @Override
            public Object doInHibernate(Session session) throws HibernateException, SQLException
            {
                
                if (!isUpdate)
                {
                    //session.createQuery(sql).
                    return session.createSQLQuery(sql.toString()).list();
                }
                else
                {
                    return session.createSQLQuery(sql).executeUpdate();
                }
            }
        });
    }
    
    /**
     * 保存
     * 
     * @param t
     */
    protected void save(T t)
    {
        getHibernateTemplate().save(t);
    }
    
    /**
     * 删除
     * 
     * @param t
     */
    protected void delete(T t)
    {
        getHibernateTemplate().delete(t);
    }
    
    /**
     * 更新
     * 
     * @param t
     */
    protected void update(T t)
    {
        this.getHibernateTemplate().merge(t);
    }
    
    /**
     * 根据ID查找对象
     * 
     * @param c
     * @param id
     * @return
     */
    protected T findObjectById(Class<T> c, String id)
    {
        return this.getHibernateTemplate().get(c, id);
    }
    
    /**
     * 根据定义好 的sql查询对象
     * 
     * @param queryName
     * @param object
     * @return
     */
    protected List<?> findByNamedQuery(final String queryName, Object... object)
    {
        return getHibernateTemplate().findByNamedQuery(queryName, object);
    }
    
    public HibernateTemplate getHibernateTemplate()
    {
        return hibernateTemplate;
    }
    
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate)
    {
        this.hibernateTemplate = hibernateTemplate;
    }

    public JdbcTemplate getJdbcTemplate()
    {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
    {
        this.jdbcTemplate = jdbcTemplate;
    }
    
    
}
